상태 레지스터
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
상태 레지스터는 프로세서의 연산 결과나 시스템 제어와 관련된 다양한 상태 정보를 저장하는 레지스터이다. 프로세서 설계에 따라 플래그의 종류와 기능이 다르며, MIPS와 Itanium처럼 상태 레지스터가 없는 경우도 있다. 일반적으로 연산 결과, 인터럽트 제어 등을 위한 플래그로 구성되며, 조건 분기 등에 활용된다. 상태 레지스터는 영 플래그, 캐리 플래그, 오버플로 플래그, 음수 플래그 등 다양한 플래그를 포함하며, 각 플래그는 연산 결과의 특정한 상태를 나타낸다. 일부 RISC 아키텍처는 비교 결과를 범용 레지스터에 저장하여 조건 분기에 사용하며, Itanium은 프레디케이트 레지스터를 활용한다. 캐리와 오버플로는 서로 다른 개념으로, x86 프로세서에서도 구분되어 사용된다.
더 읽어볼만한 페이지
- 디지털 레지스터 - 명령 레지스터
- 디지털 레지스터 - 시프트 레지스터
시프트 레지스터는 클럭 신호에 따라 데이터를 순차적으로 이동시키는 디지털 회로로, 입출력 방식에 따라 다양한 종류가 있으며, 데이터 변환, 지연 회로, 펄스 폭 확장, 스택 구현, I/O 핀 확장 등 다양한 용도로 활용된다. - 제어 흐름 - 프로그램 카운터
프로그램 카운터는 CPU 내에서 다음에 실행될 명령어의 주소를 저장하는 레지스터로, 명령어 사이클의 fetch 단계에서 사용되어 명령어를 가져오고 실행 후 갱신되며, CPU 성능 향상 기술과 현대 프로그래밍 모델에 영향을 미친다. - 제어 흐름 - 예외 처리
예외 처리는 프로그램 실행 중 예외 발생 시 정상적인 실행 흐름을 유지하거나 안전하게 종료하기 위한 메커니즘으로, 많은 프로그래밍 언어에서 제공하며 예외 안전성을 목표로 한다.
상태 레지스터 | |
---|---|
상태 레지스터 | |
유형 | 레지스터 |
용도 | ALU 연산 결과 상태 기록 인터럽트 활성화/비활성화 시스템 모드 제어 |
크기 | 아키텍처에 따라 다름 (예: 8비트, 16비트, 32비트, 64비트) |
플래그 종류 | |
부호 플래그 (Sign Flag, SF) | 연산 결과가 음수인지 나타냄 |
제로 플래그 (Zero Flag, ZF) | 연산 결과가 0인지 나타냄 |
오버플로 플래그 (Overflow Flag, OF) | 연산 결과가 너무 커서 나타낼 수 없는 경우를 나타냄 |
캐리 플래그 (Carry Flag, CF) | 덧셈에서 올림수나 뺄셈에서 빌림수가 발생했는지 나타냄 |
패리티 플래그 (Parity Flag, PF) | 결과의 1의 개수가 짝수인지 홀수인지 나타냄 |
보조 캐리 플래그 (Auxiliary Carry Flag, AF) | 덧셈 또는 뺄셈에서 하위 니블 (4비트)에서 올림수나 빌림수가 발생했는지 나타냄 |
인터럽트 활성화/비활성화 플래그 (Interrupt Enable/Disable Flag, IF) | 인터럽트 처리 활성화 여부를 제어함 |
트랩 플래그 (Trap Flag, TF) | 디버깅을 위해 단일 스텝 모드를 활성화함 |
방향 플래그 (Direction Flag, DF) | 문자열 연산 방향을 제어함 |
구조 | |
설명 | 상태 레지스터는 여러 개의 개별적인 플래그(비트)로 구성됨. 각 플래그는 특정 조건이나 상태를 나타냄. CPU는 연산 결과에 따라 플래그 값을 설정하거나 변경함. 조건부 분기 명령어는 상태 레지스터의 플래그 값을 기반으로 실행 흐름을 변경함. |
활용 | |
설명 | 조건부 분기 (Conditional Branching): 특정 플래그의 값에 따라 프로그램의 실행 경로를 변경. 오류 감지 (Error Detection): 오버플로 플래그 등을 통해 연산 오류를 감지하고 처리. 디버깅 (Debugging): 트랩 플래그를 사용하여 프로그램의 실행을 단계별로 추적. |
다른 이름 | |
다른 이름 | 플래그 레지스터 (Flag Register) 조건 코드 레지스터 (Condition Code Register) 프로그램 상태 레지스터 (Program Status Register, PSR) |
2. 상태 레지스터의 구성
상태 레지스터는 프로세서의 명령에 따른 연산 결과 (예: 오버플로)나 시스템 제어 상태 (예: 인터럽트)를 나타내는 플래그들로 구성된다.[5] 6502처럼 연산뿐 아니라 레지스터 로드만으로 상태 레지스터가 변하는 경우도 있다.[5]
일반적으로 연산 결과 플래그는 조건 분기 등에서 참조되지만, ARM처럼 모든 명령에 조건 필드가 있어 조건부 실행이 가능한 CPU도 있다.[6]
인터럽트 금지 등 시스템 제어 플래그는 OS 등이 수행하는 "민감 명령"이므로, 가상화가 중요한 최근 프로세서에서는 사용자 프로세스와 분리한다.
플래그 기호 | 이름 | 의미 |
---|---|---|
Z | 제로 플래그 | 연산 결과가 0일 때 참(1)이 된다. |
C | 캐리 플래그 | 부호 없는 수 연산에서 결과가 비트 범위를 넘어서면 참(1)이 된다. |
A | 보조 캐리 플래그 | 하위 니블(4비트) 연산에서 비트 범위를 넘어서면 참(1)이 된다. 이진화 십진법(BCD) 연산에 사용된다. |
V / O / W | 오버플로 플래그 | 부호 있는 수 연산에서 결과가 비트 범위를 넘어서면 참(1)이 된다. |
N / S | 네거티브 플래그, 사인 플래그 | 연산 결과가 음수일 때 참(1)이 된다. |
P | 패리티 플래그 | 연산 결과에서 1로 된 비트 수가 짝수이면 참(1)이 된다. |
I / E | 인터럽트 플래그 | 인터럽트 요구를 받아들일지 여부를 결정한다. |
D | 디렉션 플래그 | 문자열 조작에서 주소 레지스터 값의 증감 방향을 결정한다. (참: 감소, 거짓: 증가) |
D / T | 디버그 플래그, 트랩 플래그 | 참일 경우 한 명령이 실행될 때마다 인터럽트를 발생시켜 디버깅에 사용된다. |
2. 1. 연산 결과 플래그
상태 레지스터는 연산 결과에 따라 자동으로 설정되는 플래그들을 포함한다. 주요 플래그는 다음과 같다.플래그 기호 | 이름 | 의미 |
---|---|---|
Z | 제로 플래그 | 연산 결과가 0일 때 참(1)이 된다. |
C | 캐리 플래그 | 부호 없는 수 연산에서 결과가 비트 범위를 넘어서면 참(1)이 된다. |
A | 보조 캐리 플래그 | 하위 니블(4비트) 연산에서 비트 범위를 넘어서면 참(1)이 된다. 이진화 십진법(BCD) 연산에 사용된다. |
V / O / W | 오버플로 플래그 | 부호 있는 수 연산에서 결과가 비트 범위를 넘어서면 참(1)이 된다. |
N / S | 네거티브 플래그, 사인 플래그 | 연산 결과가 음수일 때 참(1)이 된다. |
P | 패리티 플래그 | 연산 결과에서 1로 된 비트 수가 짝수이면 참(1)이 된다. |
일부 프로세서는 인터럽트, 디렉션, 디버그 플래그 등도 포함하지만, 이 섹션에서는 연산 결과와 관련된 플래그만 간략히 설명한다.
2. 1. 1. 제로 플래그 (Z)
제로 플래그(Z)는 연산 결과가 0이면 설정(1)되고, 0이 아니면 해제(0)된다.[2] 이 플래그는 연산 결과가 0인지 아닌지를 나타낸다. 여러 프로세서에서 제로 플래그가 사용되는데, 예를 들면 다음과 같다.- 6502 프로세서: 상태 레지스터는 8비트이며, 비트 1이 제로 플래그이다.[5]
- Z80 프로세서: 상태 레지스터(플래그 레지스터)에서 비트 6이 제로 플래그이다.
- 8086 프로세서: 상태 레지스터(플래그 레지스터)는 16비트이며, 비트 6이 제로 플래그이다.[7]
- PowerPC 프로세서: 상태 레지스터(컨디션 레지스터)는 4비트 플래그 8개(CR0 - CR7)로 구성되어 있으며, 연산 명령 실행 시 지정된 컨디션 레지스터의 비트 2에 제로 플래그가 설정된다.
2. 1. 2. 네거티브/사인 플래그 (N/S)
연산 결과가 음수이면 N/S 플래그가 참이 된다.[2] 일부 프로세서에서는 N과 S 플래그가 서로 다른 의미와 용도로 구분되기도 하는데, 하나는 마지막 결과가 음수였는지 여부를 나타내고 다른 하나는 뺄셈 또는 덧셈이 발생했는지 여부를 나타낸다.[2]여러 프로세서에서 N/S 플래그가 사용되는 방식은 다음과 같다.
- 6502의 상태 레지스터에서 비트 7은 음수 플래그로, 연산 결과의 부호를 나타낸다. 6502의 연산 결과는 항상 A 레지스터에 저장되므로, 결국 A 레지스터의 MSB를 나타낸다. 로드만으로도 그 값에 의해 설정된다.[5]
- 8086의 플래그 레지스터에서 비트 7은 부호 플래그로, 연산 결과의 부호를 나타낸다.[7]
- 펜티엄의 EFLAGS 레지스터에서 비트 7은 사인 플래그이다.
- 68020의 상태 레지스터에서 비트 3은 네거티브 플래그이다.
- PowerPC의 컨디션 레지스터(CR0 - CR7)에서 Bit 0은 음수 플래그로 연산 결과가 음수일 때 설정된다.
2. 1. 3. 오버플로 플래그 (V/O/W)
오버플로 플래그는 부호 있는 수 연산에서 결과가 레지스터의 범위를 초과할 때 설정되는 플래그이다. 상태 레지스터에 포함되어 있으며, V, O, W 등의 기호로 표시된다.[2]예를 들어, 4비트 부호 있는 정수는 -8부터 7까지 표현할 수 있다. 만약 7 + 1을 계산하면, 이진수로는 다음과 같다.
```
0111
+ 0001
= 1000
```
이는 부호 있는 정수로 해석하면 -8이 되는데, 원래의 답인 8은 4비트 부호 있는 정수로 표현할 수 없기 때문에 오버플로가 발생한다. 이때 오버플로 플래그가 설정된다. 이 경우, 부호 없는 정수로 해석하면 자리올림이 발생하지 않으므로 캐리 플래그는 설정되지 않는다.[2]
프로세서의 비트 폭보다 큰 부호 있는 정수를 연산할 때는 최상위 비트만 부호 있는 것으로 해석하고, 나머지는 부호 없는 것으로 해석하여 처리할 수 있다.
2. 1. 4. 캐리 플래그 (C)
캐리 플래그는 단어 하나보다 큰 숫자를 더하거나 뺄 때, 덜 중요한 단어에서 더 중요한 단어의 최소 유효 비트로 이진 숫자를 올림/내림하여 연산할 수 있도록 한다. 부호 없는 숫자의 연산 결과가 비트 범위를 넘어섰을 때 참이 된다.[2] 많은 프로세서에서 비트 시프트 및 회전을 확장하는 데 사용된다.4비트 워드를 예로 들면, 4비트로 나타낼 수 있는 부호 없는 숫자는 0부터 15까지이다. 1001 (9)와 0111 (7)의 덧셈은 다음과 같다.
:1001
:+ 0111
:=10000
위와 같이 자리수가 넘쳐흐르는데, 캐리 플래그를 가진 프로세서에서는 이 넘쳐흐른 비트가 캐리 플래그에 들어간다.
여러 워드의 덧셈을 쉽게 하기 위해, 덧셈 명령에는 "덧셈 시 캐리 플래그의 내용도 최하위 비트에 더한다"라는 명령이 있다. 예를 들어, 00101001 (41)과 00010111 (23)의 덧셈은 다음과 같이 이루어진다.
# 하위 4비트 (1001 (9)와 0111 (7))를 더한다. (앞의 덧셈과 같다)
# 상위 4비트에 캐리를 더하여 더한다.
:1 <- 캐리
:0010
:+ 0001
:= 0100
이 결과를 연결하면 01000000 (64)가 된다.
뺄셈의 경우, 올림이 아니라 자리 빌림(보로)이 발생했는지 여부가 캐리 플래그에 저장된다. 아키텍처에 따라 보로 정보를 나타내는 보로 플래그가 캐리 플래그와 별도로 있는 경우도 있고, 캐리 플래그가 덧셈 시에는 캐리를, 뺄셈 시에는 보로를 나타내는 경우도 있다.
보로가 발생했을 때 플래그가 세워지는 방식은 아키텍처에 따라 반대일 수 있다. 이는 가산기로 2의 보수를 사용하여 뺄셈을 수행할 때, 가산기의 캐리 입출력을 그대로 다루기 때문이다. 6502, POWER, ARM, PIC 등의 프로세서가 이러한 방식을 사용한다.
하지만 반대로 되어 있어도, 긴 자리수의 덧셈이 "ADD → ADD with-carry"로 가능한 것처럼, 보통은 "SUB → SUB with-borrow"로 계산하면 앞뒤가 맞도록 설계되어 있다.
2. 1. 5. 하프 캐리/보조 캐리 플래그 (H/A/DC)
보조 캐리 플래그는 반자리 올림 플래그, 숫자 올림 또는 십진 조정 플래그라고도 불리며, 마지막 산술 연산 결과로 니블 사이(일반적으로 바이트 피연산자의 4비트 절반)에서 비트 올림이 발생했음을 나타낸다.[3] 이 플래그는 일반적으로 바이너리 하드웨어에서 BCD 산술 연산을 구현하는 데 유용하다.[3]8086의 상태 레지스터(플래그 레지스터)에서 Bit 4는 보조 캐리 플래그로, BCD 연산에 사용되는 캐리 플래그이다.[7]
2. 1. 6. 패리티 플래그 (P)
연산 결과에서 1로 된 비트의 수가 짝수일 경우 참이 된다.[3]2. 2. 제어 플래그
제어 플래그는 CPU의 동작 모드를 설정하거나 CPU의 현재 상태를 나타내는 플래그이다.플래그 기호 | 이름 | 의미 |
---|---|---|
I/E | 인터럽트 플래그 | 인터럽트 요구를 받아들일지 여부를 결정한다. |
D | 디렉션 플래그 | 문자열 조작에서 주소 레지스터 값의 증감 방향을 결정한다. (참: 감소, 거짓: 증가) |
D/T | 디버그 플래그, 트랩 플래그 | 참일 경우 한 명령이 실행될 때마다 인터럽트를 발생시켜 디버깅에 사용된다. |
S | 감독자 플래그 | 둘 이상의 보호 링을 제공하는 프로세서에서 현재 스레드의 링을 나타낸다. |
상태 레지스터는 프로세서 명령에 따른 연산 결과(예: 오버플로)나 시스템 제어 상태(예: 인터럽트)를 나타내는 플래그들로 구성된다.[5]
2. 2. 1. 인터럽트 플래그 (I/E)
I/E 플래그가 참일 경우에만 인터럽트 요구를 받아들인다. 일반적으로 관리자 모드에서만 값을 변경할 수 있다.[3] 일부 프로세서에서는 이 비트를 통해 인터럽트 활성화 여부를 나타낸다. PDP-11과 같이 여러 인터럽트 우선 순위 수준을 가진 프로세서의 경우, 여러 비트를 사용하여 현재 스레드의 우선 순위를 나타내어 더 높은 우선 순위로 설정된 하드웨어에 의해서만 인터럽트될 수 있도록 할 수 있다. 다른 아키텍처에서는 이 비트가 현재 인터럽트가 활성 상태이며 현재 스레드가 인터럽트 처리기의 일부임을 나타낼 수 있다.2. 2. 2. 디렉션 플래그 (D)
디렉션 플래그(Direction Flag, D)는 문자열 연산에서 주소 레지스터의 자동 증감 방향을 설정하는 플래그이다. 이 플래그가 참(1)이면 주소 레지스터 값이 자동으로 감소하고, 거짓(0)이면 자동으로 증가한다.[7]8086 및 펜티엄 프로세서의 플래그 레지스터에서 디렉션 플래그는 10번 비트에 위치한다.
2. 2. 3. 디버그/트랩 플래그 (D/T)
디버그/트랩 플래그(D / T)는 참으로 설정될 경우 한 명령이 실행될 때마다 인터럽트를 발생시킨다. 이는 디버깅에 사용된다.[7]프로세서 | 플래그 위치 | 설명 |
---|---|---|
인텔 8086 | Bit 8 | 싱글 스텝 모드에서의 실행을 제어한다. |
펜티엄 | Bit 8 | 트랩 플래그. |
MC68020 | Bit 15 - 14 | 트레이스 모드 플래그: 디버깅용 제어 플래그. |
2. 3. 시스템 플래그 (x86)
펜티엄의 상태 레지스터(EFLAGS 레지스터)는 32비트 크기이며, 다음과 같은 시스템 관련 플래그들을 포함하고 있다.[5]비트 | 설명 |
---|---|
21 | CPUID 명령의 사용 가능 여부를 제어한다. |
20 | 가상 86 모드에서의 인터럽트 관련 플래그이다. |
19 | 가상 86 모드에서의 인터럽트 관련 플래그이다. |
18 | 메모리 접근의 정렬 검사를 제어한다. |
17 | 가상 86 모드를 제어한다. |
16 | 디버깅 관련 제어 플래그이다. |
14 | 태스크가 중첩(nest)되어 있는지 여부를 나타낸다. |
13-12 | 현재 실행 중인 태스크의 인터럽트 특권 레벨을 나타낸다. |
15, 5, 3, 1 | 사용되지 않는다. |
2. 3. 1. 감독자 플래그 (S)
둘 이상의 보호 링을 제공하는 프로세서에서 상태 레지스터의 하나 이상의 비트는 현재 스레드의 링(권한 수준)을 나타낸다. 링이 두 개뿐인 프로세서에서는 단일 비트로 사용자 모드와 관리자 모드를 구분할 수 있다.[3]2. 3. 2. 기타 시스템 플래그 (x86)
펜티엄의 상태 레지스터(EFLAGS 레지스터)는 32비트 크기이며, 다음과 같은 시스템 관련 플래그들을 포함하고 있다.[5]비트 | 설명 |
---|---|
21 | CPUID 명령의 사용 가능 여부를 제어한다. |
20 | 가상 86 모드에서의 인터럽트 관련 플래그이다. |
19 | 가상 86 모드에서의 인터럽트 관련 플래그이다. |
18 | 메모리 접근의 정렬 검사를 제어한다. |
17 | 가상 86 모드를 제어한다. |
16 | 디버깅 관련 제어 플래그이다. |
14 | 태스크가 중첩(nest)되어 있는지 여부를 나타낸다. |
13-12 | 현재 실행 중인 태스크의 인터럽트 특권 레벨을 나타낸다. |
15, 5, 3, 1 | 사용되지 않는다. |
상태 레지스터의 구조는 프로세서 설계에 따라 플래그 기능이 약간씩 다를 수 있으며, 일부 아키텍처에는 상태 레지스터가 존재하지 않는다. 명령어와 플래그 변화 방식의 관계도 명령어 집합 아키텍처(ISA)마다 다르다. 일반적으로 각 명령어 종류에 대해 "플래그에 영향을 남기지 않는 명령어 종류"와 "모든 플래그에 영향을 남기는 명령어 종류" 두 가지는 거의 모든 ISA에 존재한다. 그 외에 "일부 플래그에는 영향을 미치고, 나머지 플래그에는 영향을 미치지 않는다"는 명령어 종류가 있는 ISA도 많다.
3. 특정 CPU 아키텍처의 상태 레지스터
다음은 몇몇 마이크로프로세서의 상태 레지스터 예시이다. 비트 위치는 각 아키텍처의 관례를 무시하고, LSB를 0으로 통일한다. "세트"는 1, "클리어"는 0을 의미한다. 설명이 없는 플래그는 이미 언급된 동일한 이름의 플래그와 동일한 역할을 한다. 플래그는 일반적으로 비트 연산으로 다루며, 마스크 문서도 참고할 수 있다.
6502, Z80, 8086, 펜티엄, 68020, PowerPC 등 다양한 CPU 아키텍처에서 상태 레지스터의 구체적인 구성과 플래그의 의미는 조금씩 다르다.
3. 1. 6502
6502의 상태 레지스터는 8비트 크기이며, 플래그 바이트라고 불린다.
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|
N | V | align="center" | | B | D | I | Z | C |
- 비트 7. 음수 플래그: 연산 결과의 양수/음수 부호를 나타낸다. 6502의 연산 결과는 항상 A 레지스터에 저장되므로, A 레지스터의 MSB를 나타낸다. 로드만으로도 그 값에 의해 설정된다[5]。
- 비트 6. 오버플로 플래그: 연산 결과가 부호 있는 8비트로 표현할 수 있는 범위를 초과했음을 나타낸다.
- 비트 5. 미사용. 항상 1.
- 비트 4. 브레이크 플래그: BRK 인터럽트 발생을 나타낸다. 6502에는 BRK와 IRQ의 두 종류의 인터럽트가 있으며, 이를 식별하기 위한 플래그이다.[8]
- 비트 3. 십진수 플래그: 설정하면 BCD 모드로 동작한다.
- 비트 2. 인터럽트 플래그: 설정하면 인터럽트가 금지된다.
- 비트 1. 제로 플래그: 연산 결과가 0일 때 설정된다. 로드만으로도 그 값에 의해 설정된다[5]。
- 비트 0. 캐리 플래그: 캐리 발생 시 및 보로가 발생하지 않았을 때 설정된다.
3. 2. Z80
Z80의 상태 레지스터는 8비트 크기이며, 플래그 레지스터라고 불린다.7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|
S | Z | H | P/V | N | C |
- Bit 7: S (부호 플래그)
- Bit 6: Z (제로 플래그)
- Bit 5: 미사용 (항상 0)
- Bit 4: H (하프 캐리 플래그, 이진화 십진법 변환 연산인 DAA와 같은 연산에서 사용)
- Bit 3: 미사용 (항상 0)
- Bit 2: P/V (패리티·오버플로 플래그, 8080에서는 P 패리티). 마지막 연산이 8비트 논리연산(AND, OR, XOR) 혹은 시프트(shift) 연산이었다면 패리티(0이면 홀수), 산술 계열 연산이었다면 오버플로(1이면 오버플로)를 나타낸다.
- Bit 1: N (감산 플래그, ADD 명령에서 0, SUB 명령에서 1)
- Bit 0: C (캐리 플래그)
3. 3. 8086
8086의 상태 레지스터는 16비트 크기이며 플래그 레지스터라고 불린다. 비트 7부터 비트 0까지는 8080/8085가 가진 플래그와 비트, 내용이 완전히 동일하다. 비트 15부터 비트 8은 8086 고유의 플래그 비트로 구성된다.[7]
15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
O | D | I | T | S | Z | A | P | C |
- Bit 11: 오버플로 플래그
- Bit 10: 디렉션 플래그. 문자열 조작 명령에서 포인터의 증감 방향을 나타낸다.
- Bit 9: 인터럽트 플래그. 클리어하면 인터럽트가 금지된다.
- Bit 8: 트랩 플래그. 싱글 스텝 모드에서의 실행을 제어한다.
- Bit 7: 부호 플래그. 연산 결과가 양수인지 음수인지를 나타낸다.
- Bit 6: 제로 플래그
- Bit 4: 보조 캐리 플래그. BCD 연산에 사용되는 캐리 플래그이다.
- Bit 2: 패리티 플래그. 연산 결과에서 1의 개수가 짝수이면 세트되고, 홀수이면 클리어된다.
- Bit 0: 캐리 플래그
- Bit 1, 3, 5, 12, 13, 14, 15: 사용되지 않는다.
3. 4. Pentium
펜티엄의 상태 레지스터는 32비트 크기이며, EFLAGS 레지스터라고 불렸다.비트 | 이름 | 설명 |
---|---|---|
31 - 22 | 미사용 | - |
21 | ID 플래그 | CPUID 명령의 사용을 제어한다. |
20 | 가상 인터럽트 펜딩 플래그 | 가상 86 모드에서의 인터럽트 관련 플래그이다. |
19 | 가상 인터럽트 플래그 | 가상 86 모드에서의 인터럽트 관련 플래그이다. |
18 | 정렬 검사 플래그 | 메모리 액세스의 정렬 검사를 제어하는 플래그이다. |
17 | 가상 86 모드 플래그 | 가상 86 모드를 제어하는 플래그이다. |
16 | 재개 플래그 | 디버깅 관련 제어 플래그이다. |
15 | 미사용 | - |
14 | 네스트 태스크 플래그 | 태스크가 네스트되어 있는지 여부를 나타낸다. |
13 - 12 | 인터럽트 특권 레벨 플래그 | 동작 중인 태스크의 인터럽트 특권 레벨을 나타낸다. |
11 | 오버플로 플래그 | |
10 | 방향 플래그 | |
9 | 인터럽트 플래그 | |
8 | 트랩 플래그 | |
7 | 사인 플래그 | |
6 | 제로 플래그 | |
5 | 미사용 | - |
4 | 보조 캐리 플래그 | |
3 | 미사용 | - |
2 | 패리티 플래그 | |
1 | 미사용 | - |
0 | 캐리 플래그 |
3. 5. 68020
68020의 상태 레지스터는 16비트이며, 상위 8비트는 시스템 바이트, 하위 8비트는 사용자 바이트 또는 조건 코드 레지스터(CCR)라고 부른다.비트 | 설명 |
---|---|
15 - 14 | 트레이스 모드 플래그: 디버깅용 제어 플래그 |
13 | 슈퍼바이저 플래그: 특권 모드를 나타냄 |
12 | 마스터 플래그: 멀티 프로세서 구성을 위한 플래그 |
11 | 미사용 |
10 - 8 | 인터럽트 마스크: 3비트로 8레벨의 인터럽트 마스크를 나타낸다. |
7 - 5 | 미사용 |
4 | 확장 플래그: 캐리 플래그와 거의 같은 의미 |
3 | 네거티브 플래그 |
2 | 제로 플래그 |
1 | 오버플로 플래그 |
0 | 캐리 플래그 |
3. 6. PowerPC
PowerPC의 상태 레지스터는 4비트 플래그 8개조로 구성되어 있으며, 컨디션 레지스터(CR0 - CR7)라고 불린다. 사칙 연산 등의 명령에서 update condition register를 지정(명령 뒤에 마침표를 붙임. 예를 들어 부호 있는 16비트 즉시 값 덧셈 addi는 addi.로 지정)하여 아래와 같이 설정된다.- Bit 0. 음수 - 연산 결과가 음수
- Bit 1. 양수 - 연산 결과가 양수 (0 포함하지 않음)
- Bit 2. 제로 - 연산 결과가 0
- Bit 3. 요약 오버플로(XER 레지스터의 SO 필드 복사)
연산 명령 실행 시 CR0 - CR7 중 어떤 컨디션 레지스터에 결과를 반영할지(또는 어디에도 반영하지 않을지)를 지정할 수 있다.
또한, 지정한 두 컨디션 레지스터끼리 비트 단위의 논리 연산이 가능하며, 그 결과를 반영할 컨디션 레지스터도 자유롭게 지정할 수 있다. 따라서 여러 크기 비교와 논리 연산을 미리 수행해 두고 하나의 조건 분기로 끝낼 수 있다.
조건 분기 시에도 어떤 컨디션 레지스터의 어떤 조를 참조할지를 지정할 수 있다. 이에 따라 플래그 갱신을 동반하는 여러 연산을 먼저 수행해 두고, 나중에 조건 분기를 수행하는 것이 가능해진다.
4. 상태 플래그를 사용하지 않는 CPU 아키텍처
MIPS 아키텍처, AMD 29000, DEC 알파, RISC-V와 같은 일부 RISC 아키텍처는 비교 결과를 범용 레지스터에 저장하는 방식을 사용한다. 이들 아키텍처에서는 비교 명령어가 결과를 단일 비트 또는 0 또는 1의 숫자 값으로 범용 레지스터에 저장하며, 조건 분기는 이 범용 레지스터의 값을 기반으로 작동한다.[4] MIPS의 경우 "자리 올림 비트"가 없지만, 여러 워드 덧셈을 수행하는 프로그램은 합계가 피연산자보다 작은지 테스트하여 오버플로 여부를 확인할 수 있다.[4]
초장 명령어(VLIW) 프로세서는 상태 플래그를 사용하지 않는 경우가 있다. 단일 명령어가 테스트를 수행하고 해당 테스트의 결과에 따라 작업을 수행하도록 지시하는 방식이다.
아이테니엄(IA-64)은 상태 레지스터 대신 프레디케이트 레지스터를 사용한다. EPIC 아키텍처 특성상 여러 명령어를 동시에 병렬 실행하기 때문에 단일 상태 레지스터로는 결과를 보존할 수 없기 때문이다. 아이테니엄은 64비트 폭의 프레디케이트 레지스터를 제공하며, 각 비트는 범용 플래그로 사용 가능하다. 비교 명령은 비교 결과를 두 개의 프레디케이트 레지스터에 저장하고, 각 명령은 체크해야 할 프레디케이트 레지스터를 지정하여 해당 레지스터가 0이면 명령을 실행하지 않는 방식으로 작동한다. 이러한 방식은 분기 명령 사용을 줄여 파이프라인의 혼란을 줄이고 고속화에 기여한다.
5. 캐리와 오버플로
캐리(Carry|캐리영어)는 '올림' 또는 '자리올림'이라는 뜻으로, 워드 연산에서 최상위 비트에서 발생한 캐리 비트가 해당 연산의 캐리이다. 예를 들어 4비트로 나타낼 수 있는 부호 없는 숫자는 0부터 15까지이다. 1001 (9)와 0111 (7)을 더하면 10000이 되어 자리수가 넘쳐흐른다. 캐리 플래그를 가진 프로세서에서는 이 넘쳐흐른 비트가 캐리 플래그에 들어간다.
"덧셈 시 캐리 플래그의 내용도 최하위 비트에 더한다"라는 명령을 사용하면 여러 워드의 덧셈을 쉽게 계산할 수 있다. 예를 들어 00101001 (41)과 00010111 (23)을 더할 때, 하위 4비트(1001 (9)와 0111 (7))를 먼저 더하고, 상위 4비트에 캐리를 더하여 결과를 연결하면 01000000 (64)가 된다.
뺄셈의 경우에는 올림 대신 자리 빌림(보로)이 발생했는지 여부가 중요하다. 아키텍처에 따라 보로 정보를 나타내는 보로 플래그가 캐리 플래그와 별도로 있거나, 덧셈 시에는 캐리 플래그가 캐리를, 뺄셈 시에는 보로를 나타내는 경우가 있다. 보로가 발생했을 때 플래그가 세워지는 방식은 반대일 수 있는데, 이는 가산기로 2의 보수를 사용하여 뺄셈을 수행할 때 가산기의 캐리 입출력을 그대로 다루기 때문이다. 6502, POWER, ARM, PIC 등의 프로세서가 이러한 방식을 사용한다.
오버플로는 "넘침"이라는 뜻으로, 부호 있는 숫자의 경우에 의미를 갖는다. 4비트로 나타낼 수 있는 부호 있는 정수는 -8부터 7까지이다. 예를 들어 7에 1을 더하면 0111 + 0001 = 1000 이 되어, 부호 있는 정수로 해석하면 -8이라는 잘못된 답이 나온다. 이는 원래 8이라는 답을 4비트 부호 있는 정수로는 나타낼 수 없기 때문에 발생하는 현상으로, 이럴 때 오버플로 플래그가 설정된다. 이 연산에서는 캐리 플래그는 설정되지 않는다.
최상위 자릿수로의 올림(또는 최상위 자릿수로부터의 빌림)이 있고, 동시에 최상위 자릿수보다 상위 자릿수로의 올림(또는 최상위 자릿수보다 상위 자릿수로부터의 빌림)이 없는 경우가 오버플로이다.
참조
[1]
웹사이트
ARM Information Center
http://infocenter.ar[...]
2019-05-18
[2]
웹사이트
Toshiba 900 Operation Manual, chap. 3
https://web.archive.[...]
[3]
웹사이트
Atmel 8-Bit Microcontroller With 4/8/16/32KBytes In-system Programmable Flash - Datasheet
http://ww1.microchip[...]
[4]
웹사이트
Carry bits; The Architect's Trap
http://yarchive.net/[...]
2013-10-05
[5]
웹사이트
(6502)The Instruction Set
http://www.obelisk.m[...]
2002-01-02
[6]
웹사이트
アーキテクチャの視点でみたARMコアの変遷と動向 ――LSI設計者は「ファミリ」に,ソフト開発者は「アーキテクチャ」に注目
http://www.kumikomi.[...]
電子・組み込み技術の総合サイト
2006-04-17
[7]
서적
マイクロコンピュータシリーズ15 8086マイクロコンピュータ
丸善株式会社
1983-04-30
[8]
문서
6502은 BRK와 IRQ 두 종류의 인터럽트가 있다.
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com